package 动态规划;

public class 爬楼梯_最优子结构 {
    /**
     *  爬楼梯最小代价
     *  https://www.hello-algo.com/chapter_dynamic_programming/dp_problem_features/
     *
     *  给定一个楼梯，你每步可以上1阶或者2阶，每一阶楼梯上都贴有一个非负整数，表示你在该台阶所需要付出的代价。
     *  给定一个非负整数数组cost ，其中cost[i]表示在第i个台阶需要付出的代价， cost[0]为地面（起始点） 。
     *  请计算最少需要付出多少代价才能到达顶部？
     */

    /* 爬楼梯最小代价：动态规划 */
    static int minCostClimbingStairsDP(int[] cost) {
        int n = cost.length-1;
        if (n <= 2) {
            return cost[n];
        }
        int[] dp = new int[n+1];
        dp[0] = 0;
        dp[1] = cost[1];
        dp[2] = cost[2];
        for (int i = 3; i <= n; i++) {
            dp[i] = Math.min(dp[i-1], dp[i-2]) + cost[i];
        }
        return dp[n];
    }

    public static void main(String[] args) {
        int[] cost = new int[]{1,2,3,4};
        System.out.println(minCostClimbingStairsDP(cost));
    }
}
